package Z2;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

/*
 Zadanie 1 (3 punkty).
 Stwórz Produkt - klasę opisującą ogólne właściwości produktu wyświetlanego w klepie internetowym.
 Zawrzyj w niej takie pola jak: nazwa, cena, waga, wysokosc, dlugosc, szerokosc. 
 Przeslon metode toString() tak aby dawala ladny komunikat wypisujacy wszystkie wartosci pol.
 Skontroluj czy dane przekazywane przez konstruktor oraz toString() dzialaja poprawnie, 
 stwórz instancję klasy Produkt i wypisz to co zwraca toString():

 System.out.println( instancjaKlasyProdukt );

 Nastepnie zserializuj ją na dysk do pliku jSerialization.dat.
 Po kolejnym zapaleniu Twojego programu niech wyszuka on czy takowy plik znajduje sie na dysku 
 i jesli tak to niech zdeserializuje obiekt z pliku do zmiennej zdeserializowanyObiekt, a potem wywola:

 System.out.println( zdeserializowanyObiekt );

 ----------------------

 Zadanie 2 (3 punkty).
 Ulepsz poprzednie zadanie o kompresowanie i dekompresowanie.
 Zapisywane dane do pliku kompresuj (czyli najpierw serializacja, 
 a tuz po niej kompresja i te dane niech laduja pliku).
 Odczytywane dane dekompresuj i nastepnie deserializuj.
 */

class Produkt implements Serializable {
	private String nazwa;
	private double cena, waga, wysokosc, dlugosc, szerokosc;

	public Produkt(String nazwa, double cena, double waga, double wysokosc,
			double szerokosc, double dlugosc) {
		this.nazwa = nazwa;
		this.cena = cena;
		this.waga = waga;
		this.wysokosc = wysokosc;
		this.szerokosc = szerokosc;
		this.dlugosc = dlugosc;
	}

	@Override
	public String toString() {
		return "Produkt: " + nazwa + " [cena=" + cena + ", dlugosc=" + dlugosc
				+ ", szerokosc=" + szerokosc + ", waga=" + waga + ", wysokosc="
				+ wysokosc + "]";
	}

}

public class Zadanie_CwUTP {

	public static void main(String[] args) {
		Produkt p1 = new Produkt("produkt1", 10.5, 20, 2.75, 5.25, 15);
		String name = "jSerialization.dat";
		// Zapis
		try {
			// serializacja obiektu
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(name));
			out.writeObject(p1);
			// kompresja
			ZipOutputStream zout = new ZipOutputStream(
					new BufferedOutputStream(
							new FileOutputStream(name + ".zip")));
			byte[] data = new byte[1024];
			BufferedInputStream bin = new BufferedInputStream(
					new FileInputStream(name));
			int count;
			zout.putNextEntry(new ZipEntry(name)); 
			while ((count = bin.read(data, 0, 1024)) != -1) {
				zout.write(data, 0, count);
			}
			bin.close();
			zout.close();

			out.close();
		} catch (IOException exc) {
			exc.printStackTrace();
		}

		// Odtworzenie
		try {
			ZipInputStream zis = new ZipInputStream(
					new BufferedInputStream(new FileInputStream(name + ".zip")));
			ZipEntry entry = zis.getNextEntry(); //bo mam tylko jeden obiekt w zip; inaczej w pętli while
			String ename = entry.getName(); 
			BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("/home/ewa/Dokumenty/" + ename),1024);  
            byte data[] = new byte[1024]; 
			int count;                        
			while ((count = zis.read(data, 0, 1024)) != -1) {
					out.write(data, 0, count);
			}
			out.close();
			zis.close();
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(
					"/home/ewa/Dokumenty/" + ename));
			Object odczytProdukt = in.readObject();
			System.out.println(odczytProdukt);
			in.close();

		} catch (IOException exc) {
			exc.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}
}